package com.imooc.concurrent.memoryVisibility;

/**
 * 内存可见性：java中，volatile 和 synchronized 、final
 * 一、导致共享变量在线程间不可见的原因：
 *  1、线程的交叉执行
 *  2、重排序结合线程交叉执行
 *  3、共享变量更新后的值没有在工作内存与主内存间及时更新
 * 二、synchronized 实现原子性及内存可见性，因为：
 *  1、线程解锁前，必须把共享变量的最新值刷新到主内存中
 *  2、线程加锁时，将清空工作内存中共享变量的值，从而使用共享变量时需要从主内存中重新读取最新最新的值
 *三、volatile 实现内存可见性，但无法保证原子性，因为：
 *  1、volatile 通过加入内存屏障和禁止重排序优化来实现的:
 *      对volatile变量执行写操作时，会在写操作后加入一个store屏障指令
 *      对volatile变量执行读操作时，会在读操作前加入一个load屏障指令
 *  2、对于保证number自增操作的原子性解决方案有：
 *      使用synchronized键字
 *      使用ReentrantLock
 *      使用AtomicInterger
 *
 */
public class Client {
}
